{{>licenseInfo}}
{{#operations}}/*
 * {{classname}}.h
 *
 * {{description}}
 */

#ifndef {{apiHeaderGuardPrefix}}_{{classname}}_H_
#define {{apiHeaderGuardPrefix}}_{{classname}}_H_

{{{defaultInclude}}}
#include "../ApiClient.h"

{{#imports}}{{{import}}}
{{/imports}}
{{^hasModelImport}}#include "../ModelBase.h"{{/hasModelImport}}

#include <boost/optional.hpp>

{{#apiNamespaceDeclarations}}
namespace {{this}} {
{{/apiNamespaceDeclarations}}

using namespace {{modelNamespace}};

{{#gmockApis}}
class {{declspec}} I{{classname}}
{
public:
    I{{classname}}() = default;
    virtual ~I{{classname}}() = default;

    {{#operation}}
    virtual pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {{operationId}}(
        {{#allParams}}
        {{^required}}boost::optional<{{/required}}{{#isFile}}std::shared_ptr<{{/isFile}}{{{dataType}}}{{#isFile}}>{{/isFile}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}},{{/hasMore}}
        {{/allParams}}
    ) = 0;
    {{/operation}}
};{{/gmockApis}}

class {{declspec}} {{classname}} {{#gmockApis}} : public I{{classname}} {{/gmockApis}}
{
public:
    {{#gmockApis}}
    using Base = I{{classname}};
    {{/gmockApis}}

    explicit {{classname}}( std::shared_ptr<ApiClient> apiClient );

    {{#gmockApis}}
    ~{{classname}}() override;
    {{/gmockApis}}
    {{^gmockApis}}
    virtual ~{{classname}}();
    {{/gmockApis}}

    {{#operation}}
    /// <summary>
    /// {{summary}}
    /// </summary>
    /// <remarks>
    /// {{notes}}
    /// </remarks>
    {{#allParams}}
    /// <param name="{{paramName}}">{{#lambda.multiline_comment_4}}{{description}}{{/lambda.multiline_comment_4}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}}</param>
    {{/allParams}}
    pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {{operationId}}(
        {{#allParams}}
        {{^required}}boost::optional<{{/required}}{{#isFile}}std::shared_ptr<{{/isFile}}{{{dataType}}}{{#isFile}}>{{/isFile}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}},{{/hasMore}}
        {{/allParams}}
    ){{#gmockApis}} override{{/gmockApis}};
    {{/operation}}

protected:
    std::shared_ptr<ApiClient> m_ApiClient;
};

{{#apiNamespaceDeclarations}}
}
{{/apiNamespaceDeclarations}}

#endif /* {{apiHeaderGuardPrefix}}_{{classname}}_H_ */

{{/operations}}
